package cn.cloud.butler.uploadapi.Utils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;


/**
 * 时间工具类
 * **/
public class DateUtils {
	// 默认日期格式
	public static final String DATE_DEFAULT_FORMAT = "yyyy-MM-dd";

	// 默认时间格式
	public static final String DATETIME_DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";
	public static final String TIME_DEFAULT_FORMAT = "HH:mm:ss";
	// 日期格式化
	private static DateFormat dateFormat = null;

	// 时间格式化
	private static DateFormat dateTimeFormat = null;

	private static DateFormat timeFormat = null;
	
	private static DateFormat sdf = null;

	private static Calendar gregorianCalendar = null;

	static {
		dateFormat = new SimpleDateFormat(DATE_DEFAULT_FORMAT);
		dateTimeFormat = new SimpleDateFormat(DATETIME_DEFAULT_FORMAT);
		timeFormat = new SimpleDateFormat(TIME_DEFAULT_FORMAT);
		gregorianCalendar = new GregorianCalendar();
		sdf = new SimpleDateFormat("yyyyMMdd_HHmmssSSS");
	}

	//去掉月份中的0
	public static String simplify_month(String date){
		int index1 = date.indexOf("-");
		int index2 = date.lastIndexOf("-");
		if (index1 == -1 || index1 != index2) return date;

		if (date.substring(index1+1, index1+2).equals("0")){
			return date.substring(0, index1+1) + date.substring(index1+2, date.length());
		}
		return date;
	}

	/**
	 * 日期格式化yyyy-MM-dd
	 * 
	 * @param date
	 * @return
	 */
	public static Date formatDate(String date, String format) {
		try {
			return new SimpleDateFormat(format).parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 日期格式化yyyy-MM-dd
	 * 
	 * @param date
	 * @return
	 */
	public static String getDateFormat(Date date) {
		return dateFormat.format(date);
	}
	
	
	/**
	 * 日期格式化yyyy-MM-dd
	 * 
	 * @param date
	 * @return
	 */
	public static String getDateFo(Date date) {
		return sdf.format(date);
	}
	

	/**
	 * 日期格式化yyyy-MM-dd HH:mm:ss
	 * 
	 * @param date
	 * @return
	 */
	public static String getDateTimeFormat(Date date) {
		return dateTimeFormat.format(date);
	}

	/**
	 * 时间格式化
	 * 
	 * @param date
	 * @return HH:mm:ss
	 */
	public static String getTimeFormat(Date date) {
		return timeFormat.format(date);
	}



	/**
	 * 日期格式化
	 * 
	 * @param date
	 * @return
	 */
	public static Date getDateFormat(String date) {
		try {
			return dateFormat.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 时间格式化
	 * 
	 * @param date
	 * @return
	 */
	public static Date getDateTimeFormat(String date) {
		try {
			return dateTimeFormat.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 获取当前日期(yyyy-MM-dd)
	 * @return
	 */
	public static Date getNowDate() {
		return DateUtils.getDateFormat(dateFormat.format(new Date()));
	}

	/**
	 * 获取当前日期星期一日期
	 * 
	 * @return date
	 */
	public static Date getFirstDayOfWeek() {
		gregorianCalendar.setFirstDayOfWeek(Calendar.MONDAY);
		gregorianCalendar.setTime(new Date());
		gregorianCalendar.set(Calendar.DAY_OF_WEEK,
				gregorianCalendar.getFirstDayOfWeek()); // Monday
		return gregorianCalendar.getTime();
	}

	/**
	 * 获取当前日期星期日日期
	 * 
	 * @return date
	 */
	public static Date getLastDayOfWeek() {
		gregorianCalendar.setFirstDayOfWeek(Calendar.MONDAY);
		gregorianCalendar.setTime(new Date());
		gregorianCalendar.set(Calendar.DAY_OF_WEEK,
				gregorianCalendar.getFirstDayOfWeek() + 6); // Monday
		return gregorianCalendar.getTime();
	}

	/**
	 * 获取日期星期一日期
	 * @param date
	 * @return
	 */
	public static Date getFirstDayOfWeek(Date date) {
		if (date == null) {
			return null;
		}
		gregorianCalendar.setFirstDayOfWeek(Calendar.MONDAY);
		gregorianCalendar.setTime(date);
		gregorianCalendar.set(Calendar.DAY_OF_WEEK,
				gregorianCalendar.getFirstDayOfWeek()); // Monday
		return gregorianCalendar.getTime();
	}

	/**
	 * 获取日期星期一日期
	 * @param date
	 * @return
	 */
	public static Date getLastDayOfWeek(Date date) {
		if (date == null) {
			return null;
		}
		gregorianCalendar.setFirstDayOfWeek(Calendar.MONDAY);
		gregorianCalendar.setTime(date);
		gregorianCalendar.set(Calendar.DAY_OF_WEEK,
				gregorianCalendar.getFirstDayOfWeek() + 6); // Monday
		return gregorianCalendar.getTime();
	}

	/**
	 * 获取当前月的第一天
	 * 
	 * @return date
	 */
	public static Date getFirstDayOfMonth() {
		gregorianCalendar.setTime(new Date());
		gregorianCalendar.set(Calendar.DAY_OF_MONTH, 1);
		return gregorianCalendar.getTime();
	}

	/**
	 * 获取当前月的最后一天
	 * 
	 * @return
	 */
	public static Date getLastDayOfMonth() {
		gregorianCalendar.setTime(new Date());
		gregorianCalendar.set(Calendar.DAY_OF_MONTH, 1);
		gregorianCalendar.add(Calendar.MONTH, 1);
		gregorianCalendar.add(Calendar.DAY_OF_MONTH, -1);
		return gregorianCalendar.getTime();
	}

	/**
	 * 获取指定月的第一天
	 * 
	 * @param date
	 * @return
	 */
	public static Date getFirstDayOfMonth(Date date) {
		gregorianCalendar.setTime(date);
		gregorianCalendar.set(Calendar.DAY_OF_MONTH, 1);
		return gregorianCalendar.getTime();
	}

	/**
	 * 获取指定月的最后一天
	 * 
	 * @param date
	 * @return
	 */
	public static Date getLastDayOfMonth(Date date) {
		gregorianCalendar.setTime(date);
		gregorianCalendar.set(Calendar.DAY_OF_MONTH, 1);
		gregorianCalendar.add(Calendar.MONTH, 1);
		gregorianCalendar.add(Calendar.DAY_OF_MONTH, -1);
		return gregorianCalendar.getTime();
	}

	/**
	 * 获取日期前一天
	 * 
	 * @param date
	 * @return
	 */
	public static Date getDayBefore(Date date) {
		gregorianCalendar.setTime(date);
		int day = gregorianCalendar.get(Calendar.DATE);
		gregorianCalendar.set(Calendar.DATE, day - 1);
		return gregorianCalendar.getTime();
	}

	/**
	 * 获取日期后一天
	 * 
	 * @param date
	 * @return
	 */
	public static Date getDayAfter(Date date) {
		gregorianCalendar.setTime(date);
		int day = gregorianCalendar.get(Calendar.DATE);
		gregorianCalendar.set(Calendar.DATE, day + 1);
		return gregorianCalendar.getTime();
	}

	/**
	 * 获取当前年
	 * 
	 * @return
	 */
	public static int getNowYear() {
		Calendar d = Calendar.getInstance();
		return d.get(Calendar.YEAR);
	}

	/**
	 * 获取当前月份
	 * 
	 * @return
	 */
	public static int getNowMonth() {
		Calendar d = Calendar.getInstance();
		return d.get(Calendar.MONTH) + 1;
	}

	/**
	 * 获取当月天数
	 * 
	 * @return
	 */
	public static int getNowMonthDay() {
		Calendar d = Calendar.getInstance();
		return d.getActualMaximum(Calendar.DATE);
	}


	/**
	 *
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public static List<Date> getEveryDay(Date startDate, Date endDate) {
		if (startDate == null || endDate == null) {
			return null;
		}
		// 格式化日期(yy-MM-dd)
		startDate = DateUtils.getDateFormat(DateUtils.getDateFormat(startDate));
		endDate = DateUtils.getDateFormat(DateUtils.getDateFormat(endDate));
		List<Date> dates = new ArrayList<Date>();
		gregorianCalendar.setTime(startDate);
		dates.add(gregorianCalendar.getTime());
		while (gregorianCalendar.getTime().compareTo(endDate) < 0) {
			// 加1天
			gregorianCalendar.add(Calendar.DAY_OF_MONTH, 1);
			dates.add(gregorianCalendar.getTime());
		}
		return dates;
	}

	/**
	 * 获取提前多少个月
	 * 
	 * @param monty
	 * @return
	 */
	public static Date getFirstMonth(int monty) {
		Calendar c = Calendar.getInstance();
		c.add(Calendar.MONTH, -monty);
		return c.getTime();
	}

	/*
	 * 计算时间差.得到相差分钟值
	 */
	public static long DataDiff(String dateA, String dateB) {
		Date startDate = getDateTimeFormat(dateA);
		Date endDate = getDateTimeFormat(dateB);
		long time = endDate.getTime() - startDate.getTime();
		long timedif = time / 1000 / 60;
		//System.out.println(timedif);
		return timedif;
	}
	
	/*
	 * 计算时间差.得到相差秒值
	 */
	public static long DataDiffSecond(String dateA, String dateB) {
		Date startDate = getDateTimeFormat(dateA);
		Date endDate = getDateTimeFormat(dateB);
		long time = endDate.getTime() - startDate.getTime();
		long timedif = time / 1000 ;
		//System.out.println(timedif);
		return timedif;
	}

	/*
	 * 
	 * 获取今天0点的时间
	 */
	public static String todayNo1() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Calendar date = Calendar.getInstance();
		date.set(Calendar.DATE, date.get(Calendar.DATE));
		String lastDay = sdf.format(date.getTime()) + " 00:00:00";
		return lastDay;
	}
	
	
	public static String test() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Calendar date = Calendar.getInstance();
		date.set(Calendar.DAY_OF_MONTH, 2);
		String lastDay = sdf.format(date.getTime()) + " 23:50:00:00";
		return lastDay;
	}
	
	//打印当前时间
	public static void currentTime(){
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
		//System.out.println(df.format(System.currentTimeMillis()));
	}
	
	//时间类型转换为Long型(毫秒值)
	public static long dateToLong(Date date) {
	 	return date.getTime()/1000;
	 }
	
	//把秒值转化为时间类型
	public static String longToDate(String time){
		Date date = new Date(Long.parseLong(time)  * 1000);
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
		return df.format(date);
	}
	
	
	//把秒值转化为时间类型
		public static String longToDateMinus8(String time){
			Date date = new Date(Long.parseLong(time)  * 1000 - 8 * 60 * 60 * 1000);
			SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
			return df.format(date);
		}
	
	public static void main(String args[]){
		/*String time = "1520362519";
		long deltaT = 0;
		long time1 = Long.parseLong(time);
		System.out.println(time1);
		//获取当前时间的long型,得到的是秒数
		System.out.println(DateUtils.dateToLong(new Date()));
		long time2 = DateUtils.dateToLong(new Date());
		
		deltaT = time1-time2;
		System.out.println("deltaT = " + deltaT);
		System.out.println(Long.toString((time2 + deltaT)));
		System.out.println(longToDate(Long.toString((time2 + deltaT))));
		*/
		/*
		String time = DateUtils.currentTimeNo1("2018-03-17 21:46:37");
		System.out.println(time);
		*/
		/*
		Date date = new Date(Long.parseLong(time) * 1000);
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
		System.out.println(df.format(date));
		System.out.println(DateUtils.dateToLong(new Date()));*/
		//return df.format(date);
		
		//Last2WeekSun();
		yearMonthDayToDate(2017,9,29);
		isNow("2018-06-22");
	}
	
	public static String currentTimelast(String time){
		Date current = DateUtils.getDateFormat(time);
		String currentTimeNo1 = dateFormat.format(current.getTime()) + " 24:00:00";
		System.out.println(currentTimeNo1);
		return currentTimeNo1;
	}
	
	public static String currentTimeNo1(String time){
		System.out.println(time);
		Date current = DateUtils.getDateFormat(time);
		String currentTimeNo1 = dateFormat.format(current.getTime()) + " 00:00:00";
		System.out.println(currentTimeNo1);
		return currentTimeNo1;
	}
	
	/**
	 * 本日上一自然周的周一日期
	 * @return
	 */
	public static String LastWeekMon()
	{
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		Calendar cal=Calendar.getInstance();
		cal.add(Calendar.WEEK_OF_MONTH, -1);
		cal.set(Calendar.DAY_OF_WEEK, 2);
		System.out.println("上周一为："+sdf.format(cal.getTime()));
		return sdf.format(cal.getTime());
	}
	
	
	/**
	 * 本日上一自然周的周日日期
	 * @return
	 */
	public static String LastWeekSun(){
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		Calendar cal=Calendar.getInstance();
		cal.set(Calendar.DAY_OF_WEEK, 1);
		System.out.println("上周日为："+sdf.format(cal.getTime()));
		return sdf.format(cal.getTime());
	}
	
	
	/**
	 * 本日上上一自然周的周一日期
	 * @return
	 */
	public static String Last2WeekMon(){
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		Calendar cal=Calendar.getInstance();
		cal.add(Calendar.WEEK_OF_MONTH, -2);
		cal.set(Calendar.DAY_OF_WEEK, 2);
		System.out.println("上周一为："+sdf.format(cal.getTime()));
		return sdf.format(cal.getTime());
	}
	
	/**
	 * 本日上上一自然周的周日日期
	 * @return
	 */
	public static String Last2WeekSun(){
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		Calendar cal=Calendar.getInstance();
		cal.add(Calendar.WEEK_OF_MONTH, -1);
		cal.set(Calendar.DAY_OF_WEEK, 1);
		System.out.println("上周日为："+sdf.format(cal.getTime()));
		return sdf.format(cal.getTime());
	}
	
	public static String yesterdayZero(){
		Date dNow = new Date();   //当前时间
		Date dBefore = new Date();
		Calendar calendar = Calendar.getInstance(); //得到日历
		calendar.setTime(dNow);//把当前时间赋给日历
		calendar.add(Calendar.DAY_OF_MONTH, -1);  //设置为前一天
		dBefore = calendar.getTime();   //得到前一天的时间
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); //设置时间格式
		String defaultStartDate = sdf.format(dBefore);    //格式化前一天
		defaultStartDate = defaultStartDate+" 00:00:00";
		System.out.println("前一天的起始时间是：" + defaultStartDate);
		return defaultStartDate;
	}
	
	public static String yesterdayNight(){
		Date dNow = new Date();   //当前时间
		Date dBefore = new Date();
		Calendar calendar = Calendar.getInstance(); //得到日历
		calendar.setTime(dNow);//把当前时间赋给日历
		calendar.add(Calendar.DAY_OF_MONTH, -1);  //设置为前一天
		dBefore = calendar.getTime();   //得到前一天的时间
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); //设置时间格式
		String defaultStartDate = sdf.format(dBefore);    //格式化前一天
		String defaultEndDate = defaultStartDate.substring(0,10)+" 23:59:59";
		System.out.println("前一天的结束时间是：" + defaultEndDate);
		return defaultEndDate;
	}
	
	public static String last2daysZero(){
		Date dNow = new Date();   //当前时间
		Date dBefore = new Date();
		Calendar calendar = Calendar.getInstance(); //得到日历
		calendar.setTime(dNow);//把当前时间赋给日历
		calendar.add(Calendar.DAY_OF_MONTH, -2);  //设置为前一天
		dBefore = calendar.getTime();   //得到前一天的时间
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); //设置时间格式
		String defaultStartDate = sdf.format(dBefore);    //格式化前一天
		defaultStartDate = defaultStartDate+" 00:00:00";
		System.out.println("前两天的起始时间是：" + defaultStartDate);
		return defaultStartDate;
	}
	
	public static String last2daysNight(){
		Date dNow = new Date();   //当前时间
		Date dBefore = new Date();
		Calendar calendar = Calendar.getInstance(); //得到日历
		calendar.setTime(dNow);//把当前时间赋给日历
		calendar.add(Calendar.DAY_OF_MONTH, -2);  //设置为前一天
		dBefore = calendar.getTime();   //得到前一天的时间
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); //设置时间格式
		String defaultStartDate = sdf.format(dBefore);    //格式化前一天
		defaultStartDate = defaultStartDate+" 00:00:00";
		String defaultEndDate = defaultStartDate.substring(0,10)+" 23:59:59";
		System.out.println("前两天的结束时间是：" + defaultEndDate);
		return defaultEndDate;
	}
	
	public static String yearMonthDayToDate(int year,int month,int day){
		Calendar calendar = Calendar.getInstance(); //得到日历
		calendar.set(year, month-1,day, 00, 00, 00);  
		String str = (new SimpleDateFormat("yyyy-MM-dd")).format(calendar.getTime());  
	    System.out.println(str); 
	    return str;
	}
	
	public static boolean isNow(String date) {
        //当前时间
        Date now = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
        //获取今天的日期
        String nowDay = sf.format(now);
         
         System.out.println(date.equals(nowDay));
        return date.equals(nowDay);
         
         
         
    }
}

